﻿using System;
using System.Collections.Generic;
using System.Configuration;
using System.Web;
using System.Linq;
using System.Web.UI.HtmlControls;
using System.Web.UI.WebControls;
using Edge.Business.Domain.Application;
using Edge.Common.ComponentModel.Parameters;
using Edge.Common.Mail;
using Edge.Common.Services;
using Edge.Common.Utils;
using Iesi.Collections.Generic;
using Shop.Business.Domain.Customers;
using Shop.Business.Domain.Orders;
using Shop.Business.Domain.Orders.Logic;
using Shop.Business.Domain.Pricing;
using Shop.Web.AppCode;

namespace Shop.Web
{
    public partial class OrderWizard : ShopBasePage
    {
        public Order SubmittedOrder
        {
            get { return (Order)(Session["SubmittedOrder"] ?? null); }
            set { Session["SubmittedOrder"] = value; }
        }

        public int customerId
        {
            get { return (int)(Session["CustomerOrder"] ?? 0); }
            set { Session["CustomerOrder"] = value; }
        }


        public int Step
        {
            get
            {
                return Convert.ToInt32(Session["SubmittedOrderStep"] ?? 0);
            }
            set { Session["SubmittedOrderStep"] = value; }
        }

        [QueryParameter("preorder", IsRequired = false)]
        public bool preorder = false;


        protected void Page_Load(object sender, EventArgs e)
        {
            WebParameterAttribute.SetValues(this, Request);
            SetTitle("Оформление заказа");
            if (Locator.GetService<IContextObjects>().Get<CustomerHolder>() == null)
                Step = 0;
            else if (Step == 0)
                Step = 1;
        }

        protected override void OnPreRender(EventArgs e)
        {
            SetPh();
        }

        private void SetPh()
        {
            string enter = "<li>0. Вход</li>";
            string order = preorder ? "<li>Оформление предзаказа</li>" : "<li>1. Оформление заказа</li>";
            string delivery = preorder ? "" : "<li>2. Доставка и оплата</li>";
            string mega = preorder ? "" : "<li>3. Подтверждение заказа</li>";
            phRegisterOrLogin.Visible = false;
            phEditOrderList.Visible = false;
            phSpecs.Visible = false;
            phMegaSubmit.Visible = false;
            ltPrePath.Text = "";
            ltCurPath.Text = "";
            ltAfterPath.Text = "";
            ltHelp.Text = "";
            divProduct.Attributes["class"] = preorder ? "product_filter ui-corner-all" : "filter ui-corner-all";
            if (Step == 0)
            {
                phRegisterOrLogin.Visible = true;
                ltCurPath.Text = enter;
                ltAfterPath.Text = order + delivery + mega;
            }
            else
            {
                if (preorder)
                {
                    Step = 1;
                    btnStep1.Text = "Подтвердить предзаказ";
                    ltPrePath.Text = order;
                }
                Customer currentCustomer = Locator.GetService<IContextObjects>().Get<CustomerHolder>().Object;
                Customer orderCustomer = customerId > 0 ? Locator.GetService<ICustomerManager>().Load(customerId) : currentCustomer;
                SubmittedOrder =
                    Locator.GetService<IOrderManager>().GetOrderWithStatus(orderCustomer, OrderStatus.Draft);
                List<OrderItem> orderItems = preorder ? SubmittedOrder.Items.Where(i => i.Product.Qty < 1).ToList() : SubmittedOrder.Items.Where(i => i.Product.Qty > 0).ToList();
                phAdmin.Visible = currentCustomer.Role != CustomerRole.Buyer;
                if (phAdmin.Visible)
                {
                    ddlCustomers.Visible = true;
                    ddlCustomers.Enabled = Step == 1;
                    btnChangeCustomer.Visible = ddlCustomers.Enabled;
                    if (ddlCustomers.Visible)
                    {
                        ddlCustomers.DataSource =
                            Locator.GetService<ICustomerManager>().FindAll().ToList().OrderBy(c => c.LastName);
                        ddlCustomers.DataTextField = "FullNameDdl";
                        ddlCustomers.DataValueField = "Id";
                        ddlCustomers.SelectedValue = orderCustomer.Id.ToString();
                        ddlCustomers.DataBind();
                    }
                }
                if (orderItems.Count < 1)
                {
                    phNoItems.Visible = true;
                    
                }
                else
                {
                    phProductList.Visible = Step != 0;
                    gridProduct.DataSource = orderItems;
                    gridProduct.DataBind();
                    OrderCalculator calculator = new OrderCalculator(SubmittedOrder,preorder);
                    var total = calculator.Total();
                    ltItog.Text = total.ToString("C");
                    gridProduct.Columns[gridProduct.Columns.Count-1].Visible = Step == 1;
                    switch (Step)
                    {
                        case 1:
                            ltCurPath.Text = order;
                            ltAfterPath.Text = preorder ? mega : delivery + mega;
                            phEditOrderList.Visible = true;
                            ltHelp.Text = preorder ? "Ваш заказ содержит товары, которых, к сожалению, в данный момент нет на нашем складе. Оформление предзаказа не означает, что вы обязательно должны будете купить данные вещи. Мы, в свою очередь, гарантируем, что цена на них останется неизменной, а сами товары будут доставлены на наш склад в течение 10-20 дней, после чего мы немедленно известим вас об их наличии." : "Оформление заказа — это быстрая и несложная процедура. Вы выбираете способ оплаты, указываете свой адрес и удобный вариант доставки, подтверждаете заказ — и все, наши курьеры уже практически едут к вам :)";
                            ltHelp.Text += "<br/>Ниже представлен список выбранных вами товаров. Вы можете отредактировать свой заказ. На следующих шагах изменить состав этого списка будет невозможно.";
                            if (((Customer) SubmittedOrder.CreatedBy).Discount > 0 && !preorder)
                            {
                                phDiscount.Visible = true;
                                ltDiscount.Text = ((Customer) SubmittedOrder.CreatedBy).Discount.ToString() + "%&nbsp;(" +
                                                  calculator.DiscountOfTotal().ToString("C") + ")";
                                ltItogWithDiscount.Text = calculator.TotalWithDiscount().ToString("C");
                            }
                            break;
                        case 2:
                            phSpecs.Visible = true;
                            ltPrePath.Text = order;
                            ltCurPath.Text = delivery;
                            ltAfterPath.Text = mega;
                            ltHelp.Text = "На данном этапе мы предлагаем выбрать различные условия оплаты и доставки.";
                            break;
                        case 3:
                            phMegaSubmit.Visible = true;
                            ltPrePath.Text = order + delivery;
                            ltCurPath.Text = mega;
                            ltHelp.Text = preorder ? " ": "ВНИМАНИЕ! ВАЖНАЯ ИНФОРМАЦИЯ! <br/> Нажатием кнопки \"Подтвердить заказ\" вы подтверждаете свое намерение приобрести товары в интернет-магазине Морлин. Согласно законодательству РФ вы имеете право вернуть товар без объяснения причины в течение 7 дней. В случае возврата товара вы оплачиваете только услуги доставки (курьерской или почтовой).";
                            OrderCalculator orderCalculator = new OrderCalculator(SubmittedOrder);
                                ltMegaItog.Text = "Адрес доставки: " + SubmittedOrder.DeliveryAddress +
                                                  "<br />Способ доставки: " + SubmittedOrder.DeliveryType.Name +
                                                  "<br />Способ оплаты: " +
                                                  EnumUtils.GetDescriptionAttribute(SubmittedOrder.PaymentType) +
                                                  "<br />Итоговая стоимость со скидкой: " +
                                                  orderCalculator.TotalWithDiscount().ToString("C") +
                                                  "<br />Доставка: " + SubmittedOrder.DeliveryType.Price.ToString("C") +
                                                  "<br />ИТОГО: " + orderCalculator.TotalWithDelivery().ToString("C");
                            break;
                        default:
                            break;
                    }
                }
            }
            ltCurPath.Text = ltCurPath.Text.Replace("<li>", "").Replace("</li>", "");
        }

        protected void btnStep0_Click(object sender, EventArgs e)
        {
            if (Locator.GetService<IContextObjects>().Get<CustomerHolder>() == null)
            {
               KeyValuePair<Customer,bool>? authCustomer = Locator.GetService<ICustomerManager>().Login(tbEmail.Text,
                                                                                 AccountUtils.CreateMD5PasswordHash(
                                                                                     tbPasswrd.Text));
                Customer customer = authCustomer.HasValue ? authCustomer.Value.Key : null;
                if (customer != null)
                {
                    if (customer.RememberMe != chbRemeberMe.Checked)
                    {
                        customer.RememberMe = chbRemeberMe.Checked;
                        Locator.GetService<ICustomerManager>().Save(customer);
                    }
                    SetCustomerHolder(customer);
                    Step = 1;
                }
            }
        }

        protected void btnStep1_Click(object sender, EventArgs e)
        {
            Step = 2;
            Customer currentCustomer = Locator.GetService<IContextObjects>().Get<CustomerHolder>().Object;
            Customer orderCustomer = customerId > 0 ? Locator.GetService<ICustomerManager>().Load(customerId) : currentCustomer;
            SubmittedOrder =
                    Locator.GetService<IOrderManager>().GetOrderWithStatus(orderCustomer, OrderStatus.Draft);
            if (preorder)
            {
                Step = 0;
                List<OrderItem> orderItems = SubmittedOrder.Items.Where(i => i.Product.Qty < 1).ToList();
                Order preder = OrderController.GeneratePreorder(orderItems, (Customer) SubmittedOrder.CreatedBy, SubmittedOrder);
                string to = ConfigurationManager.AppSettings["adminEmail"];
                Dictionary<string, object> ret = new Dictionary<string, object>();
                ret["SexEnd"] = ((Customer)preder.CreatedBy).Sex == SexType.Female ? "ая" : "ый";
                ret["FullName"] = ((Customer)preder.CreatedBy).FullName;
                ret["OrderNumber"] = preder.Id.ToString();
                ret["Table"] = "|_. |_. Артикул|_. Название|_. Цена|\r\n";
                int j = 1;
                foreach (OrderItem item in preder.Items)
                {
                    ret["Table"] += "|" + j.ToString() + ". |" + item.Product.BrandArt + "|" + item.Product.Name + "|  " + item.Price + "|\r\n";
                    j++;
                }
                ret["Total"] = "Предзаказ";
                string template = HttpContext.Current.Server.MapPath("txt") + "\\mail\\OrderOrderCash.txt";
                SendMailByTemplate mlInvite = new SendMailByTemplate("Новый заказ в интернет-магазине Морлин", template, null, to, null, ret);
                mlInvite.Send();
                Response.Redirect("Customer.aspx?status=5");
            }

        }

        protected void btnStep2_back_Click(object sender, EventArgs e)
        {
            Step = 1;
        }

        protected void btnStep2_Click(object sender, EventArgs e)
        {
            Step = 3;
        }

        protected void btnMegaSubmit_Click(object sender, EventArgs e)
        {
            Step = 1;
            Customer currentCustomer = Locator.GetService<IContextObjects>().Get<CustomerHolder>().Object;
            Customer orderCustomer = customerId > 0 ? Locator.GetService<ICustomerManager>().Load(customerId) : currentCustomer;
            SubmittedOrder =
                    Locator.GetService<IOrderManager>().GetOrderWithStatus(orderCustomer, OrderStatus.Draft);
            SubmittedOrder.OrderStatus = OrderStatus.Current;
            SubmittedOrder.Discount = ((Customer)SubmittedOrder.CreatedBy).Discount;
            SubmittedOrder.DeliveryDate = DateTime.Now.AddDays(2);
            Locator.GetService<IOrderManager>().Save(SubmittedOrder);
            Order newOrder = Locator.GetService<IOrderManager>().GetOrderWithStatus(orderCustomer, OrderStatus.Draft);
            List<OrderItem> listOrderItems = new List<OrderItem>();
            foreach (OrderItem item in SubmittedOrder.Items)
            {
                if (item.Product.PriceItem.Qty < 1)
                {
                    OrderItem itemTo = new OrderItem(item.Product, item.AddSize, item.Quantity);
                    itemTo.Order = newOrder;
                    itemTo.CreatedBy = item.CreatedBy;
                    itemTo.PriceItem = item.Product.PriceItem;
                    itemTo.Price = item.Product.Price;
                    newOrder.Items.Add(itemTo);
                    listOrderItems.Add(item);
                }
            }
            Locator.GetService<IOrderManager>().Save(newOrder);
            foreach (OrderItem item in listOrderItems)
            {
                SubmittedOrder.Items.Remove(item);
            }
            foreach (OrderItem item in SubmittedOrder.Items)
            {
                item.PriceItem = item.Product.PriceItem;
                item.PriceItem.Qty = item.PriceItem.Qty - item.Quantity;
                item.Price = item.PriceItem.Price;
            }
            OrderCalculator calculator = new OrderCalculator(SubmittedOrder, false);
            SubmittedOrder.Total = calculator.TotalWithDiscount();
            Locator.GetService<IOrderManager>().Save(SubmittedOrder);
            
//            Order newOrder = OrderController.GenerateCurrent(SubmittedOrder);
            string to = SubmittedOrder.CreatedBy.Email;
            Dictionary<string, object> ret = new Dictionary<string, object>();
            ret["SexEnd"] = ((Customer)SubmittedOrder.CreatedBy).Sex == SexType.Female ? "ая" : "ый";
            ret["FullName"] = ((Customer)SubmittedOrder.CreatedBy).FullName;
            ret["OrderNumber"] = SubmittedOrder.Id.ToString();
            ret["Table"] = "|_. |_. Артикул|_. Название|_. Цена|\r\n";
            int i = 1;
            foreach (OrderItem item in SubmittedOrder.Items)
            {
                ret["Table"] += "|" + i.ToString()+ ". |" + item.Product.BrandArt + "|" + item.Product.Name + "|  " + item.Price + "|\r\n";
                i++;
            }
            ret["Total"] = SubmittedOrder.Total.ToString("C");
            string template = HttpContext.Current.Server.MapPath("txt") + "\\mail\\OrderOrderCash.txt";
            SendMailByTemplate mlInvite = new SendMailByTemplate("Новый заказ в интернет-магазине Морлин", template, null, to, null, ret);
            mlInvite.Send();
            customerId = 0;
            Response.Redirect("Customer.aspx");
        }

        protected void btnStep3_back_Click(object sender, EventArgs e)
        {
            Step = 2;
        }

        protected void gridProduct_DataBound(object sender, GridViewRowEventArgs e)
        {
            OrderItem item = (OrderItem) e.Row.DataItem;
            HtmlGenericControl btnChangeSize = (HtmlGenericControl)e.Row.FindControl("btnChangeSize");
            if (btnChangeSize != null)
            {
                btnChangeSize.Visible = item.Product.Group.Products.Count > 1;
                btnChangeSize.Attributes["OnClick"] = "CreateOrOpenPopup('divOrderItem_" + item.Id + "', '', 400, '" +
                                                      item.Product.Group.Name + "', '', '', '','ChangeSize', 'id=" +
                                                      item.Id + "')";
            }
        }

        protected void btnChangeCustomer_Click(object sender, EventArgs e)
        {
            customerId = Convert.ToInt32(ddlCustomers.SelectedValue); 
            Customer currentCustomer = Locator.GetService<IContextObjects>().Get<CustomerHolder>().Object;
            Customer orderCustomer = customerId > 0 ? Locator.GetService<ICustomerManager>().Load(customerId) : currentCustomer;
            if (currentCustomer != orderCustomer)
            {
                Order currentOrder = Locator.GetService<IOrderManager>().GetOrderWithStatus(orderCustomer, OrderStatus.Draft);
                List<OrderItem> orderItems = preorder
                                                 ? currentOrder.Items.Where(i => i.Product.Qty < 1).ToList()
                                                 : currentOrder.Items.Where(i => i.Product.Qty > 0).ToList();
                Order newOrder = new Order{CreatedBy = orderCustomer,OrderStatus = preorder ? OrderStatus.Preorder : OrderStatus.Draft};
                foreach (OrderItem item in orderItems)
                {
                    item.Order = newOrder;
                    item.CreatedBy = orderCustomer;
                    newOrder.Items.Add(item);
                    currentOrder.Items.Remove(item);
                }
                Locator.GetService<IOrderManager>().Save(newOrder);

            }
            SetPh();
        }
    }
}
